共计 8280 个字符,预计需要花费 21 分钟才能阅读完成。
背景
这里不在啰嗦赘述prometheu、thanos、victoriametrics 等组件的异同优劣,网上文章都快讲烂掉。
参考链接:https://cloud.tencent.com/developer/article/2145684
使用 vm 有几点重要原因:
- 配置简单,无缝兼容 prometheu 。无论是存储数据的导入, 抓取配置,还是查询接口。
- 降低 使用 prometheu 的内存和磁盘负载。
- 解决 数据长期存储问题。
- 解决 prometheu 原生不支持集群的问题。
- 当 prometheus 数据量过大时,高负载往往会令人头痛。
- 选择单机纵向扩展吧,单节点往往会扛不住超大数据样本的查询,而且当故障恢复时,从wal中加载数据到内存需要超长时间。
- 横向拓展又没有原生的集群实现,只能依赖联邦或者thanos等其他方式。
官方介绍的很美好,本文我在个人环境使用单机版部署,实践下来结果基本符合。 12G / 1.6G = 7.5。对磁盘的压力少了7.5倍。
# du -sh /var/lib/prometheus/
12G /var/lib/prometheus/
# du -sh /var/lib/victoria-metrics/
1.6G /var/lib/victoria-metrics/
后续计划于线上环境进行改造。
实践
vm部署
参考链接:https://docs.victoriametrics.com/quick-start/#starting-vm-single-from-a-binary
操作系统:Ubuntu20.04
部署方式:单机版二进制部署
官网已经有全量的playbook,但是太重,我编写了一个简单的ansible playbook:
16:08:39 # tree
.
├── hosts
├── roles
│ └── VictoriaMetrics
│ ├── files
│ │ ├── victoria-metrics-linux-amd64-v1.103.0.tar.gz
│ │ ├── victoria-metrics-prod
│ │ ├── victoriametrics.service
│ │ ├── vmagent-prod
│ │ ├── vmalert-prod
│ │ ├── vmalert-tool-prod
│ │ ├── vmauth-prod
│ │ ├── vmbackup-prod
│ │ ├── vmctl-prod
│ │ ├── vmrestore-prod
│ │ └── vmutils-linux-amd64-v1.103.0.tar.gz
│ └── tasks
│ └── main.yml
└── VictoriaMetrics.yml
4 directories, 14 files
[root@ centos-ops /ansible/monitor]
16:08:58 # cat VictoriaMetrics.yml
- hosts: Install_VictoriaMetrics
roles:
- VictoriaMetrics
[root@ centos-ops /ansible/monitor]
16:09:03 # cat roles/VictoriaMetrics/tasks/main.yml
- name: 获取 VictoriaMetrics 最新发布版本信息
delegate_to: 127.0.0.1
uri:
url: https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest
return_content: yes
validate_certs: no
register: latest_release
#- name: 调试输出 latest_release 的内容
# delegate_to: 127.0.0.1
# debug:
# var: latest_release.json
- name: 提取符合条件的下载地址列表
delegate_to: 127.0.0.1
set_fact:
filtered_assets: "{{ latest_release.json.assets | selectattr('name', 'search', '^victoria-metrics-linux-amd64-v[0-9.]+\\.tar\\.gz$') | map(attribute='browser_download_url') }}"
- name: 调试输出 filtered_assets 变量
delegate_to: 127.0.0.1
debug:
var: filtered_assets
- name: 设置下载地址
delegate_to: 127.0.0.1
set_fact:
package_url: "{{ filtered_assets | first }}"
when: filtered_assets | length > 0
- name: 检查下载地址是否已设置
fail:
msg: "未找到符合条件的下载地址。"
when: package_url is not defined
- name: 调试输出 package_url 变量
delegate_to: 127.0.0.1
debug:
var: package_url
- name: 创建目录
delegate_to: 127.0.0.1
file:
path: "{{ role_path }}/files"
state: directory
- name: 下载 VictoriaMetrics 最新发布版本安装包
delegate_to: 127.0.0.1
get_url:
url: "{{ package_url }}"
dest: "{{ role_path }}/files/{{ package_url | basename }}"
- name: 解压 VictoriaMetrics 安装包
delegate_to: 127.0.0.1
unarchive:
src: "{{ role_path }}/files/{{ package_url | basename }}"
dest: "{{ role_path }}/files/"
remote_src: yes
- name: 将 victoria-metrics-prod(单机版) 下发到远端
copy:
src: "{{ role_path }}/files/victoria-metrics-prod"
dest: /usr/local/bin/victoria-metrics-prod
mode: '0755'
delegate_to: "{{ inventory_hostname }}"
- name: 创建 victoriametrics 用户
user:
name: victoriametrics
shell: /usr/sbin/nologin
system: yes
- name: 创建用于存储 VictoriaMetrics 数据的文件夹
file:
path: /var/lib/victoria-metrics
state: directory
owner: victoriametrics
group: victoriametrics
mode: '0755'
- name: 下发 systemd 单元文件
copy:
src: "{{ role_path }}/files/victoriametrics.service"
dest: /etc/systemd/system/victoriametrics.service
mode: '0644'
- name: 刷新 systemd 配置
command: systemctl daemon-reload
- name: 启用 victoriametrics 服务并设置开机自启
systemd:
name: victoriametrics
enabled: yes
state: started
- name: 检查 victoriametrics 服务运行状态
command: systemctl status victoriametrics.service
register: service_status
ignore_errors: yes
- name: 调试输出服务状态
debug:
var: service_status.stdout_lines
抓取配置。这个文件是直接拷贝了原始 prometheus.yml,删除了prometheu自身的监控job。
# cat /etc/victoria-metrics/prometheus.yml
global:
evaluation_interval: 15s
scrape_interval: 30s
scrape_timeout: 10s
rule_files:
- "/etc/victoria-metrics/rules/*rules.yml"
scrape_configs:
- job_name: victoria-metrics-prod
static_configs:
- targets:
- localhost:8428
- job_name: "node_exporter"
file_sd_configs:
- files:
- "/etc/victoria-metrics/file_sd/node.yml"
- job_name: 'blackbox_http'
scrape_interval: 60s
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- files:
- '/etc/victoria-metrics/file_sd/blackbox_http.yml'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9119
- job_name: 'blackbox_ping'
scrape_interval: 60s
metrics_path: /probe
params:
module: [icmp]
file_sd_configs:
- files:
- '/etc/victoria-metrics/file_sd/blackbox_ping.yml'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9119
- job_name: 'blackbox_tcp'
scrape_interval: 30s
metrics_path: /probe
params:
module: [tcp_connect]
file_sd_configs:
- files:
- '/etc/victoria-metrics/file_sd/blackbox_tcp.yml'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9119
- job_name: 'blackbox_tls'
scrape_interval: 30s
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- files:
- '/etc/victoria-metrics/file_sd/blackbox_tls.yml'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9119
部署:
ansible-playbook -i hosts VictoriaMetrics.yml
数据写入配置
vm 和 prometheu 类似,同时支持 push
和 pull
两种模型。重点介绍pull。
作为 prometheu 远程存储
参考链接:docs.victoriametrics.com/#prometheus-setup
如果仅希望使用 vm 作为 prometheu 的长期存储,降低 prometheu 的存储和读取压力。可以选择使用 prometheu 远程存储,将数据持久化写入到 vm 中。
prometheu配置:
# vim /etc/prometheus/prometheus.yml
remote_write:
- url: http://127.0.0.1:8428/api/v1/write
直接抓取 exporter
参考链接:docs.victoriametrics.com/vmagent/?highlight=promscrapeconfigstri…
如果希望使用 vm 替代 prometheu,则需要像 prometheu 一样,直接从 exporter 中抓取数据。
vm 兼容 prometheus.yml 配置文件,但是 prometheus.yml 中可能存在不兼容的配置。需要配置启动命令过滤一些不受支持的 job。
相关的启动参数:promscrape.config
、promscrape.config.strictParse
16:19:58 # cat /etc/systemd/system/victoriametrics.service
[Unit]
Description=VictoriaMetrics service
After=network.target
[Service]
Type=simple
User=victoriametrics
Group=victoriametrics
ExecStart=/usr/local/bin/victoria-metrics-prod \
-storageDataPath=/var/lib/victoria-metrics \
-retentionPeriod=90d \
-selfScrapeInterval=10s \
-promscrape.config=/etc/victoria-metrics/prometheus.yml \
-promscrape.config.strictParse=false
SyslogIdentifier=victoriametrics
Restart=always
PrivateTmp=yes
ProtectHome=yes
NoNewPrivileges=yes
ProtectSystem=full
[Install]
WantedBy=multi-user.target
导入 prometheu 数据
参考链接:docs.victoriametrics.com/vmctl/?highlight=vmbatchsize%3D200000#i…
无论采取 作为 prometheu 远程存储
或 直接抓取 exporter
作为拉取方式,后续的监控数据查询都需要直接访问 vm 。
所以需要将 prometheu 的历史数据导入到 vm 中。
# 生成prometheus 数据快照,需要在prometheu执行命令添加参数 --web.enable-admin-api
# 生成的快照为 prometheu data 硬链接,并不会直接占用大量磁盘,往往几秒钟即可生成快照
curl -XPOST 127.0.0.1:9090/api/v1/admin/tsdb/snapshot
# 由于数据样本过多,导入之前请确认文件描述符是否够用。否则会出现 too many open files 报错
# 这里使用命令临时扩大了限制
ulimit -n 65536
# 使用 vmctl-prod 导入数据
12:22:30 # /ansible/monitor/roles/VictoriaMetrics/files/vmctl-prod prometheus --prom-snapshot=/var/lib/prometheus/snapshots/20240929T040741Z-37c2ae8c99894d97 --vm-concurrency=1 --vm-batch-size=200000 --prom-concurrency=3
Prometheus import mode
Prometheus snapshot stats:
blocks found: 2162;
blocks skipped by time filter: 0;
min time: 1719799202256 (2024-07-01T10:00:02+08:00);
max time: 1727582860693 (2024-09-29T12:07:40+08:00);
samples: 6039512403;
series: 51533350.
Found 2162 blocks to import. Continue? [Y/n] y
VM worker 0:↓ 1969775 samples/s
Processing blocks: 2161 / 2162 [██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████] 99.95%
2024/09/29 13:11:05 Import finished!
2024/09/29 13:11:05 VictoriaMetrics importer stats:
idle duration: 6m51.959900277s;
time spent while importing: 48m25.622479983s;
total samples: 6039512403;
samples/s: 2078560.60;
total bytes: 122.1 GB;
bytes/s: 42.0 MB;
VM worker 0:↙ 1969775 samples/s
Processing blocks: 2162 / 2162 [█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████] 100.00%
2024/09/29 13:11:05 Total time: 48m30.11928336s
12GB数据,官方推荐参数,在 nvme ssd下导入花费47分钟。大约 4MB/S。
# du -sh /var/lib/prometheus/
12G /var/lib/prometheus/
# du -sh /var/lib/victoria-metrics/
1.6G /var/lib/victoria-metrics/
导入完毕后压缩为1.6G,降低7.5倍的存储量。
Grafana 配置
由于个人环境中的 panel 都绑定了旧 prometheu 数据源,修改上百个panel不是一件好方式。
直接将数据源修改为 vm 的 ip:port 就好。
查看面板,可以发现无缝兼容。
参考链接:grafana.com/grafana/dashboards/10229-victoriametrics-single-node…
官方提供了针对 vm 自身的监控,酌情添加:
总结
vm 可以极大降低使用 prometheu 的硬件成本,同时迁移到 vm 路线也仅需要付出极少的人工成本。
生产环境更换后的使用案例后续再更新。
本文属于专题:Prometheus 监控
- 使用 Redis Exporter 监控 Redis
- Grafana 备份、迁移与升级
- 云原生监控 Kube-Prometheus
- Prometheus 集成 Nginx 监控
- Prometheus 查询指定时间范围内的峰值或均值
- 云监控接入本地Prometheus
- 使用 MySQL Exporter 监控MySQL
- 个人微信接收夜莺告警消息
- PushGateway 报错:too many open files
- Blackbox 网络监控
- node_exporter 添加自定义指标
- Python 实现资源水位巡检
- Prometheus 替代方案:VictoriaMetrics
- 使用 node_exporter 实现路由器监控
引用链接
- https://cloud.tencent.com/developer/article/2145684
- https://docs.victoriametrics.com/quick-start/#starting-vm-single-from-a-binary
- docs.victoriametrics.com/#prometheus-setup
- docs.victoriametrics.com/vmagent/?highlight=promscrapeconfigstri...
- docs.victoriametrics.com/vmctl/?highlight=vmbatchsize%3D200000#i...
- grafana.com/grafana/dashboards/10229-victoriametrics-single-node...